package org.pointex.common.util;

/**
 * java��ȡ��html��ǩ���ַ���,�ٰѱ�ǩ��ȫ(��֤ҳ����ʾЧ��)<br>
 * һ���������ַ�������html��ǩ�Ľ�ȡ.��: ��̨�����������߱༭��, ǰ̨��ʾ����Ҫ��ȡ�����.<br>
 * 
 * @author Szqiu
 *
 */
public class SubStringHTML {
	public static void main(String[] args) {
		String htmlCode = "<h1><span style=\"\" mce_style=\"font-size: xx-large; color: #000000;\">�»�������7��13,.</span></h1><h1><span>����7������13</span></h1>";
		System.out.println(subStringHTML(htmlCode, 5));
		// ���Խ����<h1><span style="font-size: xx-large; color: #000000;"
		// mce_style="font-size: xx-large; color: #000000;">�»���</span></h1>
	}

	/**
	 * ���ӽڳ��Ƚ�ȡ�ַ���(֧�ֽ�ȡ��HTML������ʽ���ַ���)<br>
	 * �磺<span>�й��˷�����</span> ����ȡ2���ֽڵõ��Ľ���ǣ�<span>�й�
	 * 
	 * @param param
	 *            ��Ҫ��ȡ�ĺ�html������ַ�������
	 * @param percent
	 *            ��ȡ�������ܳ��ȵİٷ�֮��; percent ����С����; �����׳��쳣
	 * @return ���ؽ�ȡ����ַ���
	 * @author YangJunping
	 * @date 2010-7-15
	 */
	public static String subStringHTML(String param, float percent) {
		StringBuffer result = new StringBuffer();
		int n = 0;
		char temp;
		boolean isCode = false; // �ǲ���HTML����
		boolean isHTML = false; // �ǲ���HTML�����ַ�,��&nbsp;
		// ����������ʾ���ȣ��������°ٷֱ���ʾ
		Integer length = (int) (param.length() * percent);
		// �����½�ȡ�İٷֱȳ���С����Сֵʱ���Զ���ֵΪ�������Сֵ
		if(length < 200){
			length = 200;
		}
		if(length > 950){
			length = 950;
		}
		for (int i = 0; i < param.length(); i++) {
			temp = param.charAt(i);
			if (temp == '<') {
				isCode = true;
			} else if (temp == '&') {
				isHTML = true;
			} else if (temp == '>' && isCode) {
				n = n - 1;
				isCode = false;
			} else if (temp == ';' && isHTML) {
				isHTML = false;
			}
			if (!isCode && !isHTML) {
				n = n + 1;
				// UNICODE���ַ�ռ�����ֽ�
				if ((temp + "").getBytes().length > 1) {
					n = n + 1;
				}
			}
			result.append(temp);
			if (n >= length) {
				break;
			}
		}
		return fix(result.toString()) + "...";
	}

	/**
	 * ��ȫHTML����<br>
	 * �磺<span>�й� ---> <span>�й�</span>
	 * 
	 * @param str
	 * @return
	 * @author YangJunping
	 * @date 2010-7-15
	 */
	private static String fix(String str) {
		StringBuffer fixed = new StringBuffer(); // ����޸�����ַ���
		TagsList[] unclosedTags = getUnclosedTags(str);
		// �������ַ���
		for (int i = unclosedTags[0].size() - 1; i > -1; i--) {
			fixed.append("<" + unclosedTags[0].get(i) + ">");
		}
		fixed.append(str);
		for (int i = unclosedTags[1].size() - 1; i > -1; i--) {
			String s = null;
			if ((s = unclosedTags[1].get(i)) != null) {
				fixed.append("</" + s + ">");
			}
		}
		return fixed.toString();
	}

	private static TagsList[] getUnclosedTags(String str) {
		StringBuffer temp = new StringBuffer(); // ��ű�ǩ
		TagsList[] unclosedTags = new TagsList[2];
		unclosedTags[0] = new TagsList(); // ǰ���պϣ�����</div>��ǰ��û��<div>
		unclosedTags[1] = new TagsList(); // �󲻱պϣ�����<div>������û��</div>
		boolean flag = false; // ��¼˫����"������'
		char currentJump = ' '; // ��¼��Ҫ����''����""
		char current = ' ', last = ' '; // ��ǰ & ��һ��
		// ��ʼ�ж�
		for (int i = 0; i < str.length();) {
			current = str.charAt(i++); // ��ȡһ���ַ�
			if (current == '"' || current == '\'') {
				flag = flag ? false : true; // ��Ϊ���ţ�flag��ת
				currentJump = current;
			}
			if (!flag) {
				if (current == '<') { // ��ʼ��ȡ��ǩ
					current = str.charAt(i++);
					if (current == '/') { // ��ǩ�ıպϲ��֣���</div>
						current = str.charAt(i++);
						// ��ȡ��ǩ
						while (i < str.length() && current != '>') {
							temp.append(current);
							current = str.charAt(i++);
						}
						// ��tags_bottom�Ƴ�һ���պϵı�ǩ
						if (!unclosedTags[1].remove(temp.toString())) { // ���Ƴ�ʧ�ܣ�˵��ǰ��û����Ҫ�պϵı�ǩ
							unclosedTags[0].add(temp.toString()); // �˱�ǩ��Ҫǰ�պ�
						}
						temp.delete(0, temp.length()); // ���temp
					} else { // ��ǩ��ǰ���֣���<div>
						last = current;
						while (i < str.length() && current != ' ' && current != ' ' && current != '>') {
							temp.append(current);
							last = current;
							current = str.charAt(i++);
						}
						// �Ѿ���ȡ����ǩ�������������ݣ���<div id=test>����id=test
						while (i < str.length() && current != '>') {
							last = current;
							current = str.charAt(i++);
							if (current == '"' || current == '\'') { // �ж�����
								flag = flag ? false : true;
								currentJump = current;
								if (flag) { // �����Ų��պϣ���������һ������֮�������
									while (i < str.length() && str.charAt(i++) != currentJump)
										;
									current = str.charAt(i++);
									flag = false;
								}
							}
						}
						if (last != '/' && current == '>') // �ж��������ͣ�<TagName />
							unclosedTags[1].add(temp.toString());
						temp.delete(0, temp.length());
					}
				}
			} else {
				while (i < str.length() && str.charAt(i++) != currentJump)
					; // ��������֮��Ĳ���
				flag = false;
			}
		}
		return unclosedTags;
	}
}
